#include <stdio.h>
//栈之顺序栈 （后进先出）
//1️⃣正常初始化
#define MAXSIZE 100
typedef int ElemType;
//声明
typedef struct 
{
    ElemType data[MAXSIZE];
    int top;
}Stack;
//初始化
void initstack(Stack *s)
{
    s->top=-1;
}
//入栈（压栈）
int push(Stack *s,ElemType n)
{
    if(s->top>=MAXSIZE-1)   //下标是0~MAXSIZE-1
    {
        printf("栈满了\n");
        return 0;
    }
    else
    {
        s->top++; //栈顶+1
        s->data[s->top]=n;
        return 1;
    }
}
//打印
void printstack(Stack *s)
{
    if(s->top==-1)
    {
        printf("空栈\n");
    }
    else
    {
        int i;
        for(i=0;i<=s->top;i++)   
        {
            printf("%d ",s->data[i]);
        }
        printf("\n");
    }
}
//出栈
int pop(Stack *s,ElemType *ret)
{
    if(s->top==-1)
    {
        printf("空栈\n");
        return 0;
    }
    else
    {
        *ret=s->data[s->top]; //保存我要传回的出栈数据，获取栈顶元素
        s->top--;
        return 1;
    }
}
int main()
{
    Stack s;
    initstack(&s);
    //入栈
    push(&s,22);
    push(&s,52);
    push(&s,66);
    push(&s,88);
    //打印
    printstack(&s);
    //出栈
    ElemType ret=0;
    pop(&s,&ret);
    printf("出栈的数据是%d\n",ret);
    //打印
    printstack(&s);
    return 0;
}

//2️⃣动态内存分配初始化
#include <stdlib.h>
#define MAXSIZE 100
typedef int ElemType;
//声明
typedef struct 
{
    ElemType *data;
    int top;
}Stack;
//初始化
Stack *initstack()
{
    Stack *s=(Stack *)malloc(sizeof(Stack));
    s->data=(ElemType *)malloc(sizeof(ElemType)*MAXSIZE);
    s->top=-1;
    return s;
}
//入栈
int push(Stack *s,ElemType n)
{
    if(s->top>=MAXSIZE-1)
    {
        printf("满了\n");
        return 0;
    }
    else
    {
        s->top++;
        s->data[s->top]=n;
        return 1;
    }
}
//打印
void printstack(Stack *s)
{
    if(s->top==-1)
    {
        printf("空栈\n");
    }
    else
    {
        int i;
        for(i=0;i<=s->top;i++)   
        {
            printf("%d ",s->data[i]);
        }
        printf("\n");
    }
}
//出栈
int pop(Stack *s,ElemType *ret)
{
    if(s->top==-1)
    {
        printf("空栈\n");
        return 0;
    }
    else
    {
        *ret=s->data[s->top]; //保存我要传回的出栈数据，获取栈顶元素
        s->top--;
        return 1;
    }
}
int main()
{
    Stack *s=initstack();
    //入栈
    push(s,22);
    push(s,52);
    push(s,66);
    push(s,88);
    //打印
    printstack(s);
    //出栈
    ElemType ret=0;
    pop(s,&ret);
    printf("出栈的数据是%d\n",ret);
    //打印
    printstack(s);
    //释放
    free(s->data);
    free(s);
    return 0;
}
